// 两线程，单核系统，操作同一个全局变量
// 加入互斥锁【错误示范】
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>

int g_i = 1000000;

// 互斥锁
// 一般一个临界资源一个互斥锁
// 互斥锁一般都定义为全局变量
pthread_mutex_t g_lock;

// 工作线程入口函数
void* thread_start(void* arg)
{
    (void)arg;
    // 修改全局变量
    while(g_i > 0)
    {
        // 加锁（进入临界区前）
        pthread_mutex_lock(&g_lock);
        
        printf("this is work:%p, g_i is %d\n",pthread_self(), g_i);
        g_i--;

        // 解锁（退出临界区前）
        pthread_mutex_unlock(&g_lock);

        //sleep(1);  //让程序结果更明显
    }

    return NULL;
}
int main()
{
    // 初始化锁
    pthread_mutex_init(&g_lock, NULL);
    // 创建两个线程
    pthread_t tid[2];  //线程标识符数组
    int i = 0;
    for(; i < 2; ++i)
    {
        int ret = pthread_create(&tid[i], NULL, thread_start, NULL);
        if(ret < 0)
        {
            perror("pthread_create ERROE");
            return 0;
        }
    }
    // 主线程进行线程等待
    for(i = 0; i < 2; ++i)
    {
        pthread_join(tid[i], NULL);
    }
    return 0;
}
